﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;

namespace Pittypat
{
    /// <summary>
    /// 提供用户信息和用户对目标功能的权限信息，用于权限检查的结果。
    /// </summary>
    public sealed class Permission
    {
        /// <summary>
        /// 未授权的匿名用户，这是未使用 <see cref="ModuleAttribute.AllowAnonymous"/> 标记的模块的默认权限。这是一个只读静态字段。
        /// </summary>
        internal static readonly Permission AnonymousUnauthorized = new Permission(Pittypat.User.Anonymous, false);

        /// <summary>
        /// 已授权的匿名用户，这是使用 <see cref="ModuleAttribute.AllowAnonymous"/> 标记的模块的默认权限。这是一个只读静态字段。
        /// </summary>
        internal static readonly Permission AnonymousAuthorized = new Permission(Pittypat.User.Anonymous, true);

        // 当前用户信息
        private IUser user;
        // 对目标功能用户是否被授权
        private bool authorized;

        /// <summary>
        /// 使用指定的用户信息和授权信息初始化 <see cref="Permission"/> 类的新实例。
        /// </summary>
        /// <param name="user">用户信息。</param>
        /// <param name="authorized">指示用户是否已被授权使用目标功能。</param>
        /// <exception cref="ArgumentNullException">user 为 null。</exception>
        public Permission(IUser user, bool authorized)
        {
            if (user == null)
            {
                throw new ArgumentNullException("user");
            }

            this.user = user;
            this.authorized = authorized;
        }

        /// <summary>
        /// 获取当前用户的用户信息。
        /// </summary>
        public IUser User
        {
            get
            {
                return this.user;
            }
        }

        /// <summary>
        /// 获取一个值，该值指示当前用户是否对目标功能拥有权限。
        /// </summary>
        public bool Authorized
        {
            get
            {
                return this.authorized;
            }
        }
    }
}
